// go语言类型转换
package main

import (
	"fmt"
	"strconv"
)

/**
 * 基本格式:type_name(expression)
 */
func t1() {
	var sum int = 17
	var count int = 5
	var mean float32
	mean = float32(sum) / float32(count)
	fmt.Printf("mean 的值为：%f\n", mean)
}

/**
 * 字符串类型转换
 */
func t2() {
	str := "123"
	name, err := strconv.Atoi(str)
	if err != nil {
		fmt.Println("转换错误:", err)
	} else {
		fmt.Printf("字符串 '%s' 转换为整数为: %d\n", str, name)
	}
}

func t3() {
	num := 123
	str := strconv.Itoa(num)
	fmt.Printf("整数 %d 转换为字符串为: '%s'\n", num, str)
}

/**
 * 字符串转为浮点数
 */
func t4() {
	str := "3.14"
	num, err := strconv.ParseFloat(str, 64)
	if err != nil {
		fmt.Println("转换错误:", err)
	} else {
		fmt.Printf("字符串 '%s' 转换为浮点数为: %f\n", str, num)
	}
}

func t5() {
	num := 3.14
	str := strconv.FormatFloat(num, 'f', 2, 64)
	fmt.Printf("浮点数 %f 转为字符串为：'%s'\n", num, str)
}

/**
 * 接口类型转换
 * 接口类型转换有两种情况：类型断言和类型转换。
 * 类型断言用于将接口类型转换为指定类型，其语法为：
 * value.(type) 或者 value.(T)
 */
func t6() {
	var i interface{} = "Hello, World!"
	str, ok := i.(string)
	if ok {
		fmt.Printf("'%s' is a string\n", str)
	} else {
		fmt.Println("conversion failed")
	}
}

type Writer interface {
	Write([]byte) (int, error)
}
type StringWriter struct {
	str string
}

func (sw *StringWriter) Write(data []byte) (int, error) {
	sw.str += string(data)
	return len(data), nil
}

func t7() {
	var w Writer = &StringWriter{}
	sw := w.(*StringWriter)
	sw.str = "Hello World"
	fmt.Println(sw.str)
}

func main() {
	t1()
	t2()
	t3()
	t4()
	t5()
	t6()
	t7()
}
